package com.smilive.start.netty.jdk;

import com.smilive.start.netty.utils.ByteBufferUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @program: netty_start
 * @Date: 2021-12-30 11:54
 * @Author: smilive
 * @Description:  使用ByteBuffer读取文件中的内容
 */
@Slf4j
public class ByteBufferTest {

    public static void main(String[] args) {
        //获取FileChannel
        try (FileChannel channel = new FileInputStream(ResourceUtils.getURL("classpath:").getPath()+ File.separator+"byteBuffer.txt").getChannel()){
            //获得缓冲区
            ByteBuffer byteBuffer = ByteBuffer.allocate(10);
            StringBuilder builder = new StringBuilder();
            int count = 0;
            while (channel.read(byteBuffer) > 0){
                count++;
                //切换读模式 limit = 已经写入的数据大小(此次文件有16个字节,ByteBuffer容量为10个字节,
                // 分两次写入,所以第一次 limit = 10,第二次limit=6), poition = 0
                byteBuffer.flip();
                System.out.println(String.format("第%s次切换到读数据模式",count));
                ByteBufferUtil.debugAll(byteBuffer);
                while (byteBuffer.hasRemaining()){
                    // byteBuffer.get() 返回的是字节, (char) 将字节转成字符
                    builder.append((char) byteBuffer.get());
                }
                //切换写模式 position=0, limit=capacity
                //clear: 会把position重置未起始位置,从0位置开始写
                //compact: 会把未读的数据往前压缩,position位置不变,然后切换到读模式(这样就可以保留未读数据,从未读数据末端开始写)
                byteBuffer.clear();
            }
            System.out.println(builder.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
